export default class CacheObj<K, V> {

    protected key: K;
    protected obj: V;
    //上次访问时间
    lastAccess: number
    //访问次数
    accessCount: number
    //对象存活时长，0表示永久
    ttl: number

    constructor(K: K, V: V, ttl: number) {
        this.key = K;
        this.obj = V;
        this.lastAccess = Date.now();
        this.accessCount = 0;
        this.ttl = ttl;
    }

    /**
     * 获取键
     * @return 键
     * @since 4.0.10
     */
    public getKey(): K {
        return this.key;
    }

    /**
     * 获取值
     * @return 值
     * @since 4.0.10
     */
    public getValue(): V {
        return this.obj;
    }


    /**
     * 判断是否过期
     *
     * @return 是否过期
     */
    isExpired(): boolean {
        if (this.ttl > 0) {
            // 此处不考虑时间回拨
            return (Date.now() - this.lastAccess) > this.ttl;
        }
        return false;
    }

    /**
     * 获取值
     *
     * @param isUpdateLastAccess 是否更新最后访问时间
     * @return 获得对象
     * @since 4.0.10
     */
    get(isUpdateLastAccess: boolean): V {
        if (isUpdateLastAccess) {
            this.lastAccess = Date.now();
        }
        this.accessCount++;
        return this.obj;
    }
}